package org.dtrd.modules.system.entity.bean.qiyeweixin;

import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
import org.dtrd.config.system.Constant;

import java.util.List;

/**
 * @author qr
 * @date 2022/3/7 09:59
 */
@ApiModel(value = "企微机器人消息", description = "https://developer.work.weixin.qq.com/document/path/91770#%E6%A8%A1%E7%89%88%E5%8D%A1%E7%89%87%E7%B1%BB%E5%9E%8B")
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class RobotMessage {

    @ApiModelProperty("消息类型")
    private String msgtype;

    @ApiModelProperty("text内容")
    private Text text;

    @ApiModelProperty("markdown内容")
    private Markdown markdown;

    @ApiModelProperty("图片内容")
    private Image image;

    @ApiModelProperty("图文消息")
    private News news;

    @ApiModelProperty(value = "文件, 上传接口后的字符串", reference = "https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key=KEY&type=TYPE")
    private File file;

    @ApiModelProperty("模版卡片类型")
    private TemplateCard template_card;

    public RobotMessage(){}

    public RobotMessage(Constant.RobotMsgType msgtype) {
        this.msgtype = msgtype.getName();
    }

    public RobotMessage(Constant.RobotMsgType msgType, Image image) {
        this(msgType);
        this.image = image;
    }

    public RobotMessage(Constant.RobotMsgType msgtype, Text text) {
        this(msgtype);
        this.text = text;
    }

    public RobotMessage(Constant.RobotMsgType msgtype, Markdown markdown) {
        this(msgtype);
        this.markdown = markdown;
    }

    public static RobotMessage file(Constant.RobotMsgType msgType, String file) {
        RobotMessage robotMessage = new RobotMessage(msgType);
        robotMessage.setFile(new File(file));
        return robotMessage;
    }

    public static RobotMessage news(Constant.RobotMsgType msgType, Articles[] articles) {
        RobotMessage robotMessage = new RobotMessage(msgType);
        robotMessage.setNews(new News(articles));
        return robotMessage;
    }

    public static RobotMessage textNotice(Constant.RobotMsgType msgType, TemplateCard template_card) {
        RobotMessage robotMessage = new RobotMessage();
        robotMessage.setMsgtype("template_card");
        template_card.setCard_type(msgType.getName());
        robotMessage.setTemplate_card(template_card);
        return robotMessage;
    }

    public static RobotMessage newsNotice(Constant.RobotMsgType robotMsgType, TemplateCard news_notice) {
        RobotMessage robotMessage = new RobotMessage();
        robotMessage.setMsgtype("template_card");
        news_notice.setCard_type(robotMsgType.getName());
        robotMessage.setTemplate_card(news_notice);
        return robotMessage;
    }

    /**
     * 卡片类型
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    @Getter
    @Setter
    @ApiModel("卡片类型对象")
    public static class TemplateCard {

        @ApiModelProperty(value = "模版卡片的模版类型", notes = "text_notice: 文本通知模版卡片/news_notice: 图文展示模版卡片", required = true)
        private String card_type;

        @ApiModelProperty("卡片来源样式信息")
        private Source source;

        @ApiModelProperty(value = "模版卡片的主要内容，包括一级标题和标题辅助信息", required = true)
        private TextContent main_title;

        @ApiModelProperty(value = "关键数据样式")
        private TextContent emphasis_content;

        @ApiModelProperty("引用文献样式，建议不与关键数据共用")
        private QuoteArea quote_area;

        @ApiModelProperty("二级普通文本，建议不超过112个字。模版卡片主要内容的一级标题main_title.title和二级普通文本sub_title_text必须有一项填写")
        private String sub_title_text;

        @ApiModelProperty("二级标题+文本列表，该字段可为空数组，但有数据的话需确认对应字段是否必填，列表长度不超过6")
        private List<UrlContent> horizontal_content_list;

        @ApiModelProperty("跳转指引样式的列表，该字段可为空数组，但有数据的话需确认对应字段是否必填，列表长度不超过3")
        private List<UrlContent> jump_list;

        @ApiModelProperty("整体卡片的点击跳转事件，text_notice模版卡片中该字段为必填项")
        private UrlContent card_action;

        @ApiModelProperty("整体卡片的点击跳转事件，text_notice模版卡片中该字段为必填项")
        private CardImage card_image;

        @ApiModelProperty("左图右文样式")
        private ImageTextArea image_text_area;

        @ApiModelProperty("卡片二级垂直内容，该字段可为空数组，但有数据的话需确认对应字段是否必填，列表长度不超过4")
        private List<TextContent> vertical_content_list;

        @ApiModel("图文展示模版类型中, 左图右文样式")
        @Getter
        @Setter
        @JsonInclude(JsonInclude.Include.NON_NULL)
        public static class ImageTextArea {
            @ApiModelProperty("左图右文样式区域点击事件，0或不填代表没有点击事件，1 代表跳转url，2 代表跳转小程序")
            private Integer type;
            @ApiModelProperty("点击跳转的url，image_text_area.type是1时必填")
            private String url;
            @ApiModelProperty("点击跳转的小程序的appid，必须是与当前应用关联的小程序，image_text_area.type是2时必填")
            private String appid;
            @ApiModelProperty("点击跳转的小程序的pagepath，image_text_area.type是2时选填")
            private String pagepath;
            @ApiModelProperty("左图右文样式的标题")
            private String title;
            @ApiModelProperty("左图右文样式的描述")
            private String desc;
            @ApiModelProperty("左图右文样式的图片url")
            private String image_url;
        }

        @ApiModel("整体卡片点击跳转事件")
        @Getter
        @Setter
        @JsonInclude(JsonInclude.Include.NON_NULL)
        public static class CardImage {
            @ApiModelProperty(value = "卡片跳转类型，1 代表跳转url，2 代表打开小程序。text_notice模版卡片中该字段取值范围为[1,2]", required = true)
            private Integer type;
            @ApiModelProperty("跳转事件的url，card_action.type是1时必填")
            private String url;
            @ApiModelProperty("跳转事件的小程序的appid，card_action.type是2时必填")
            private String appid;
            @ApiModelProperty("跳转事件的小程序的pagepath，card_action.type是2时选填")
            private String pagepath;
            @ApiModelProperty("图片的宽高比，宽高比要小于2.25，大于1.3，不填该参数默认1.3")
            private float aspect_ratio;
        }

        @ApiModel("卡片来源样式信息")
        @Getter
        @Setter
        @JsonInclude(JsonInclude.Include.NON_NULL)
        public static class Source {
            @ApiModelProperty("来源图片的url")
            private String icon_url;
            @ApiModelProperty("来源图片的描述，建议不超过13个字")
            private String desc;
            @ApiModelProperty("来源文字的颜色，目前支持：0(默认) 灰色，1 黑色，2 红色，3 绿色")
            private String desc_color;
        }

        @ApiModel(value = "文本类内容", description = "例如标题, 关键数据样式")
        @Getter
        @Setter
        @JsonInclude(JsonInclude.Include.NON_NULL)
        public static class TextContent {
            @ApiModelProperty("标题，建议不超过26个字。")
            private String title;
            @ApiModelProperty("辅助信息，建议不超过30个字")
            private String desc;
        }

        @ApiModel("引用文献样式，建议不与关键数据共用")
        @Getter
        @Setter
        @JsonInclude(JsonInclude.Include.NON_NULL)
        public static class QuoteArea {
            @ApiModelProperty("引用文献样式区域点击事件，0或不填代表没有点击事件，1 代表跳转url，2 代表跳转小程序")
            private Integer type;
            @ApiModelProperty("点击跳转的url，quote_area.type是1时必填")
            private String url;
            @ApiModelProperty("点击跳转的小程序的appid，quote_area.type是2时必填")
            private String appid;
            @ApiModelProperty("点击跳转的小程序的pagepath，quote_area.type是2时选填")
            private String pagepath;
            @ApiModelProperty("引用文献样式的标题")
            private String title;
            @ApiModelProperty("引用文献样式的引用文案")
            private String quote_text;
        }

        @ApiModel("跳转类内容")
        @Getter
        @Setter
        @JsonInclude(JsonInclude.Include.NON_NULL)
        public static class UrlContent {
            @ApiModelProperty("二级标题，建议不超过5个字")
            private String keyname;
            @ApiModelProperty("二级文本，如果horizontal_content_list.type是2，该字段代表文件名称（要包含文件类型），建议不超过26个字")
            private String value;
            @ApiModelProperty("链接类型时，0或不填代表是普通文本，1 代表跳转url，2 代表下载附件，3 代表@员工" +
                    "卡片跳转类型时，1 代表跳转url，2 代表打开小程序。text_notice模版卡片中该字段取值范围为[1,2]")
            private Integer type;
            @ApiModelProperty("链接跳转的url，horizontal_content_list.type是1时必填" +
                    "跳转事件的url，card_action.type是1时必填")
            private String url;
            @ApiModelProperty("附件的media_id，horizontal_content_list.type是2时必填")
            private String media_id;
            @ApiModelProperty("被@的成员的userid，horizontal_content_list.type是3时必填")
            private String userid;
            @ApiModelProperty("跳转链接样式的文案内容，建议不超过13个字")
            private String title;
            @ApiModelProperty("跳转链接的小程序的appid，jump_list.type是2时必填" +
                    "跳转事件的小程序的appid，card_action.type是2时必填")
            private String appid;
            @ApiModelProperty("跳转链接的小程序的pagepath，jump_list.type是2时选填" +
                    "跳转事件的小程序的pagepath，card_action.type是2时选填")
            private String pagepath;
        }
    }

    @ApiModel("图文类型内容")
    @Getter
    @Setter
    public static class News {

        @ApiModelProperty("图文消息，一个图文消息支持1到8条图文")
        private Articles[] articles;

        public News(Articles[] articles){
            this.articles = articles;
        }
    }

    @Getter
    @Setter
    @AllArgsConstructor
    public static class File {

        @ApiModelProperty("上传文件后获取的 media_id https://developer.work.weixin.qq.com/document/path/91770?version=4.0.0.70098&platform=mac#%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0%E6%8E%A5%E5%8F%A3")
        private String media_id;
    }

    @ApiModel("图片类型内容")
    @Getter
    @Setter
    @AllArgsConstructor
    public static class Image {

        @ApiModelProperty(value = "图片内容的base64编码", notes = "图片（base64编码前）最大不能超过2M，支持JPG,PNG格式", required = true)
        private String base64;

        @ApiModelProperty(value = "图片内容（base64编码前）的md5值", required = true)
        private String md5;
    }

    /**
     * 图文
     */
    @ApiModel("图文类型里的 article 类")
    @Getter
    @Setter
    public static class Articles {

        @ApiModelProperty(value = "标题，不超过128个字节，超过会自动截断", required = true)
        private String title;

        @ApiModelProperty("描述，不超过512个字节，超过会自动截断")
        private String description;

        @ApiModelProperty(value = "点击后跳转的链接", required = true)
        private String url;

        @ApiModelProperty("图文消息的图片链接，支持JPG、PNG格式，较好的效果为大图 1068*455，小图150*150")
        private String picurl;
    }

    @ApiModel(value = "markdown类型内容", description = "https://developer.work.weixin.qq.com/document/path/91770?version=4.0.0.70098&platform=mac#markdown%E7%B1%BB%E5%9E%8B")
    @Getter
    @Setter
    public static class Markdown {
        @ApiModelProperty(value = "markdown内容，最长不超过4096个字节，必须是utf8编码", required = true)
        private String content;
    }


    @ApiModel("文本类型内容")
    @Getter
    @Setter
    public static class Text extends CommonMsgProperty {
        @ApiModelProperty(value = "文本内容，最长不超过2048个字节，必须是utf8编码", required = true)
        private String content;
    }

    /**
     * 消息公共部分内容
     * TODO 似乎只有 text 类型才有?
     */
    @ApiModel("公共字段")
    @Getter
    @Setter
    public static class CommonMsgProperty {

        @ApiModelProperty("userid的列表，提醒群中的指定成员(@某个成员)，@all表示提醒所有人，如果开发者获取不到userid，可以使用mentioned_mobile_list")
        private String[] mentioned_list;

        @ApiModelProperty("手机号列表，提醒手机号对应的群成员(@某个成员)，@all表示提醒所有人")
        private String[] mentioned_mobile_list;
    }
}
